package com.nidu.demo.menu.util;

import cn.hutool.core.collection.CollUtil;
import com.nidu.demo.common.constants.Constants;
import com.nidu.demo.common.enums.MenuTypeEnum;
import com.nidu.demo.menu.dto.MenuCO;
import com.nidu.demo.menu.dto.MenuTreeCO;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 菜单树形结构工具类
 *
 * @author auto
 */
public class MenuUtil {

    /**
     * 构建菜单树形结构
     *
     * @param menuList 菜单列表
     * @return 树形结构列表
     */
    public static List<MenuTreeCO> buildMenuTree(List<MenuTreeCO> menuList) {
        if (CollUtil.isEmpty(menuList)) {
            return Collections.emptyList();
        }
        // 排序，保证菜单的有序性
        menuList.sort(Comparator.comparing(MenuCO::getSortOrder));

        // 构建菜单树
        // 使用 LinkedHashMap 的原因，是为了排序
        Map<Long, MenuTreeCO> treeNodeMap = new LinkedHashMap<>();
        menuList.forEach(menu -> treeNodeMap.put(menu.getId(), (menu)));
        // 处理父子关系
        treeNodeMap.values().stream().filter(node -> !node.getParentId().equals(Constants.ROOT_MENU_ID)).forEach(childNode -> {
            // 获得父节点
            MenuTreeCO parentNode = treeNodeMap.get(childNode.getParentId());
            if (parentNode == null) {
                return;
            }
            // 将自己添加到父节点中
            if (parentNode.getChildren() == null) {
                parentNode.setChildren(new ArrayList<>());
            }
            parentNode.getChildren().add(childNode);
        });
        // 获得到所有的根节点
        return treeNodeMap.values().stream().filter(node -> Constants.ROOT_MENU_ID.equals(node.getParentId())).collect(Collectors.toList());
    }


} 